package cn.tedu.reflection;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//测试 反射
public class Test1 {
    public static void main(String[] args) throws Exception {
//        method();//反射操作成员变量
//        method2();//反射操作成员方法
        method3();//反射操作构造方法
    }

    public static void method3() throws Exception {
        //1.获取Class对象
        Class c=Human.class;
        //2.获取构造方法
        Constructor[] a=c.getConstructors();
        //遍历数组，得到每个构造方法con
        for (Constructor con : a) {
            System.out.println(con.getName());
            Class[] cc=con.getParameterTypes();
            if (cc.length==0){//无参构造
                Object o=con.newInstance();
                System.out.println(o);
            }
            if (cc.length==3){
                Object o=con.newInstance("jack",20,1000.0);
                System.out.println(o);
            }
        }
    }

    public static void method2() throws Exception {
        //1.获取Class对象
        Class c=Human.class;
        //2.获取成员方法
        Method[] b=c.getMethods();
        for (Method m : b) {
            System.out.println(m.getName());
           //只执行test1
            if (m.getName().equals("test3")){
                Object obj= c.newInstance();
                m.invoke(obj,10);//执行方法
            }
        }
    }

    public static void method() throws Exception {
        //1.获取Class对象
        Class c=Human.class;
        //2.获取成员变量
        Field[] a=c.getFields();
        //遍历数组，得到每个变量
        for (Field f:a) {
            //获取属性名
            System.out.println(f.getName());
        //3.name属性进行set/get
        if(f.getName().equals("name")){
        Object obj=c.newInstance();
            f.set(obj,"jack");//设置属性值
            System.out.println(f.get(obj));//获取属性
        }
        }
    }
}
